From 049f841900e0e196f4eba293aadf84b0735ee8d0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Timm=20B=C3=A4der?= Date: Sat, 7 Mar 2020 14:48:07 +0100 Subject: [PATCH] padcontroller: Copy action entries The label and action_name entries of GtkPadActionEntry are supposed to be const, so copy them into a private ActionEntryData struct that we later free. --- gtk/gtkpadcontroller.c | 94 ++++++++++++++++++++++++------------------ gtk/gtkpadcontroller.h | 8 ++-- 2 files changed, 57 insertions(+), 45 deletions(-) diff --git a/gtk/gtkpadcontroller.c b/gtk/gtkpadcontroller.c index d3efc61426..ef86f8c76a 100644 --- a/gtk/gtkpadcontroller.c +++ b/gtk/gtkpadcontroller.c @@ -84,7 +84,7 @@ struct _GtkPadController { GActionGroup *action_group; GdkDevice *pad; - GList *entries; + GArray *action_entries; }; struct _GtkPadControllerClass { @@ -98,42 +98,31 @@ enum { N_PROPS }; -static GParamSpec *pspecs[N_PROPS] = { NULL }; - -G_DEFINE_TYPE (GtkPadController, gtk_pad_controller, GTK_TYPE_EVENT_CONTROLLER) - -static GtkPadActionEntry * -gtk_pad_action_entry_copy (const GtkPadActionEntry *entry) +typedef struct { - GtkPadActionEntry *copy; - - copy = g_slice_new0 (GtkPadActionEntry); - *copy = *entry; - copy->label = g_strdup (entry->label); - copy->action_name = g_strdup (entry->action_name); + GtkPadActionType type; + int index; + int mode; + char *label; + char *action_name; +} ActionEntryData; - return copy; -} +static GParamSpec *pspecs[N_PROPS] = { NULL }; -static void -gtk_pad_action_entry_free (GtkPadActionEntry *entry) -{ - g_free (entry->label); - g_free (entry->action_name); - g_slice_free (GtkPadActionEntry, entry); -} +G_DEFINE_TYPE (GtkPadController, gtk_pad_controller, GTK_TYPE_EVENT_CONTROLLER) -static const GtkPadActionEntry * +static const ActionEntryData * gtk_pad_action_find_match (GtkPadController *controller, GtkPadActionType type, gint index, gint mode) { - GList *l; + guint i; - for (l = controller->entries; l; l = l->next) + for (i = 0; i < controller->action_entries->len; i++) { - GtkPadActionEntry *entry = l->data; + const ActionEntryData *entry = &g_array_index (controller->action_entries, + ActionEntryData, i); gboolean match_index = FALSE, match_mode = FALSE; if (entry->type != type) @@ -151,7 +140,7 @@ gtk_pad_action_find_match (GtkPadController *controller, static void gtk_pad_controller_activate_action (GtkPadController *controller, - const GtkPadActionEntry *entry) + const ActionEntryData *entry) { g_action_group_activate_action (controller->action_group, entry->action_name, @@ -160,7 +149,7 @@ gtk_pad_controller_activate_action (GtkPadController *controller, static void gtk_pad_controller_activate_action_with_axis (GtkPadController *controller, - const GtkPadActionEntry *entry, + const ActionEntryData *entry, gdouble value) { g_action_group_activate_action (controller->action_group, @@ -177,7 +166,7 @@ gtk_pad_controller_handle_mode_switch (GtkPadController *controller, #ifdef GDK_WINDOWING_WAYLAND if (GDK_IS_WAYLAND_DISPLAY (gdk_device_get_display (pad))) { - const GtkPadActionEntry *entry; + const ActionEntryData *entry; gint elem, idx, n_features; for (elem = GTK_PAD_ACTION_BUTTON; elem <= GTK_PAD_ACTION_STRIP; elem++) @@ -235,7 +224,7 @@ gtk_pad_controller_handle_event (GtkEventController *controller, { GtkPadController *pad_controller = GTK_PAD_CONTROLLER (controller); GdkEventType event_type = gdk_event_get_event_type (event); - const GtkPadActionEntry *entry; + const ActionEntryData *entry; GtkPadActionType type; guint index, mode, group; gdouble value = 0; @@ -346,8 +335,17 @@ static void gtk_pad_controller_finalize (GObject *object) { GtkPadController *controller = GTK_PAD_CONTROLLER (object); + guint i; + + for (i = 0; i < controller->action_entries->len; i++) + { + const ActionEntryData *entry = &g_array_index (controller->action_entries, + ActionEntryData, i); - g_list_free_full (controller->entries, (GDestroyNotify) gtk_pad_action_entry_free); + g_free (entry->label); + g_free (entry->action_name); + } + g_array_free (controller->action_entries, TRUE); G_OBJECT_CLASS (gtk_pad_controller_parent_class)->finalize (object); } @@ -385,6 +383,7 @@ gtk_pad_controller_class_init (GtkPadControllerClass *klass) static void gtk_pad_controller_init (GtkPadController *controller) { + controller->action_entries = g_array_new (FALSE, TRUE, sizeof (ActionEntryData)); } /** @@ -444,11 +443,25 @@ static void gtk_pad_controller_add_entry (GtkPadController *controller, const GtkPadActionEntry *entry) { - GtkPadActionEntry *copy; + guint i; + const ActionEntryData new_entry = { + .type = entry->type, + .index = entry->index, + .mode = entry->mode, + .label= g_strdup (entry->label), + .action_name = g_strdup (entry->action_name) + }; + + g_array_set_size (controller->action_entries, controller->action_entries->len + 1); + + for (i = 0; i < controller->action_entries->len; i++) + { + if (entry_compare_func (&new_entry, + &g_array_index (controller->action_entries, ActionEntryData, i)) == 0) + break; + } - copy = gtk_pad_action_entry_copy (entry); - controller->entries = g_list_insert_sorted (controller->entries, copy, - (GCompareFunc) entry_compare_func); + g_array_insert_val (controller->action_entries, i, new_entry); } /** @@ -496,13 +509,12 @@ gtk_pad_controller_set_action_entries (GtkPadController *controller, void gtk_pad_controller_set_action (GtkPadController *controller, GtkPadActionType type, - gint index, - gint mode, - const gchar *label, - const gchar *action_name) + int index, + int mode, + const char *label, + const char *action_name) { - GtkPadActionEntry entry = { type, index, mode, - (gchar *) label, (gchar *) action_name }; + const GtkPadActionEntry entry = { type, index, mode, label, action_name }; g_return_if_fail (GTK_IS_PAD_CONTROLLER (controller)); g_return_if_fail (type <= GTK_PAD_ACTION_STRIP); diff --git a/gtk/gtkpadcontroller.h b/gtk/gtkpadcontroller.h index 0fabc4a146..b0749d626e 100644 --- a/gtk/gtkpadcontroller.h +++ b/gtk/gtkpadcontroller.h @@ -68,10 +68,10 @@ typedef enum { */ struct _GtkPadActionEntry { GtkPadActionType type; - gint index; - gint mode; - gchar *label; - gchar *action_name; + int index; + int mode; + const char *label; + const char *action_name; }; GDK_AVAILABLE_IN_ALL -- 2.30.2